import { Watcher } from "./Watcher.js"


/**
 * 初始化computed 配置
 * 为每一项实例化一个Watcher，并将其属性代理到Vue实例上
 * 结合watcher.dirty 和 watcher.evalute 实现computed 缓存
 * @param {*} vm Vue实例
 */
export function initComputed(vm) {
  // 获取computed配置项
  const computed = vm.$options.computed
  // 记录watcher
  const watcher = vm._watcher = Object.create(null)
  // 遍历computed 对象
  for(let key in computed) {
    // 实例化Watcher， 回调函数默认懒执行
    watcher[key] = new Watcher(computed[key], { lazy: true }, vm)
    // 将computed 的属性key 代理到vue实例上
    defineComponent(vm, key)
  }
}

/**
 * 代理key 到vm实例上
 * @param {*} vm 实例
 * @param {*} key computed 的计算属性
 */
function defineComponent(vm, key) {
  // 定义对象描述符
  const descriptor = {
    get: function() {
      const watcher = vm._watcher[key]
      // 说明在当前渲染周期内已经被执行过
      // 执行 evalute, 通知watcher 执行computed 回调函数，得到回调函数的返回值
      if (watcher.dirty) {
        watcher.evalute()
      }
      return watcher.value
    },
    set: function() {

    }
  }
  // 代理
  Object.defineProperty(vm, key, descriptor)
}